
package QuanLiDaiLy.DAO;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;

/**
 * Class cung cấp các phương thưc tĩnh hỗ trợ công việc liên kết CSDL.
 * @author HuuTri
 */
public class SqlDAOHelper {
  
    protected static String sDbUrl = "jdbc:derby://localhost:1527/QuanLiDaiLy";
    protected static String sUser = "sida";
    protected static String sPassword = "123456789";
    protected static Connection connection = null;
    protected static Statement statement = null;
    
    
    public static boolean insert(String tablename, List<Parameter> lParam) 
                                         throws SQLException, ClassNotFoundException {
        boolean fail = false;
        try {
            openConnection();
            insertCommand(tablename, lParam);
        } catch(SQLException e){
            if (connection != null) {
                connection.rollback();
            }
            fail = true;
        } finally {
            closeConnection();
        }
        
        return !fail;
    }
    
     public static boolean delete(String tablename, List<Parameter> lParam) 
                                         throws SQLException, ClassNotFoundException {
        boolean fail = false;
        try {
            openConnection();
            deleteCommand(tablename, lParam);
        } catch(SQLException e){
            if (connection != null) {
                connection.rollback();
            }
            fail = true;
        } finally {
            closeConnection();
        }
        
        return !fail;
    }
     
     public static boolean update(String tablename, List<Parameter> lParam, List<Parameter> lValue) 
                                         throws SQLException, ClassNotFoundException {
          boolean fail = false;
            try {
                openConnection();
                updateCommand(tablename, lParam, lValue);
            } catch(SQLException e){
                if (connection != null) {
                    connection.rollback();
                }
                fail = true;
            } finally {
                closeConnection();
            }

            return !fail;
     }
    
    /**Mở kết nối tới database*/
    protected static boolean openConnection() throws ClassNotFoundException, SQLException {
        try {
            Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
            connection = DriverManager.getConnection(sDbUrl, sUser, sPassword);
        } catch (SQLException e) {
            return false;
        }
        return true;        
    }   
    
    /**Đóng kết nối database*/
    protected static boolean closeConnection() throws SQLException {
        if (connection != null){
            connection.close();
        }
        return true;
    }
    
    /**Thêm một records vào tablename với danh sách tham số lParam*/
    protected static void insertCommand(String tableName, List<Parameter> lParam) throws ClassNotFoundException, SQLException {
        String sParam = ListParameter.getParameterFormat(lParam, ParamType.name);  
        String sValue = ListParameter.getParameterFormat(lParam, ParamType.value);
        
        statement = connection.createStatement();
        statement.executeUpdate(String.format("INSERT INTO %s(%s) VALUES(%s)",
                                                        tableName, sParam, sValue));
        statement.close();
    } 
    
    /**Xóa một record khỏi bảng tablename có danh sách tham số lParam*/
    protected static void deleteCommand(String tablename, List<Parameter> lParam) throws SQLException {
        String sValue;
        sValue = ListParameter.getParameterFormat(lParam, ParamType.namevalueand);
        
        statement = connection.createStatement();
        statement.executeUpdate(String.format("DELETE FROM %s WHERE %s",
                                                    tablename, sValue));
        statement.close();
    }
    
    /**Cập nhật một record trong tablename có danh sách tham số lParam và giá trị thay đổi lValue*/
    protected static void updateCommand(String tablename, 
                                            List<Parameter> lParam, 
                                            List<Parameter> lValue) 
                                            throws SQLException {
        
        String sParam = ListParameter.getParameterFormat(lParam, ParamType.namevalueand);
        String sValue = ListParameter.getParameterFormat(lParam, ParamType.namevalue);
        
        statement = connection.createStatement();
        statement.executeUpdate(String.format("UPDATE %s SET %s WHERE %s",
                                                    tablename, sValue, sParam));
        statement.close();
    }
}
